כותרת מאמר
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
גלו את שאילתות הקונטיינר ב-CSS, האבולוציה הבאה בעיצוב רספונסיבי. למדו ליצור רכיבים מותאמים לגודל הקונטיינר, לא רק לגודל אזור התצוגה.
עיצוב רספונסיבי הוא אבן יסוד בפיתוח ווב במשך למעלה מעשור. באופן מסורתי, הסתמכנו על שאילתות מדיה (media queries) כדי להתאים את הפריסות שלנו בהתבסס על גודל אזור התצוגה (viewport). עם זאת, גישה זו יכולה לפעמים להרגיש מגבילה, במיוחד כאשר מתמודדים עם עיצובים מורכבים מבוססי רכיבים. הכירו את שאילתות הקונטיינר ב-CSS – תכונה חדשה ועוצמתית המאפשרת לרכיבים להתאים את עצמם בהתבסס על גודל האלמנט המכיל אותם, ולא רק על אזור התצוגה.
שאילתות קונטיינר הן משנות משחק מכיוון שהן מאפשרות עיצוב רספונסיבי מבוסס רכיבים. במקום לשאול "מהו גודל המסך?", תוכלו לשאול "כמה מקום זמין יש לרכיב זה?". זה פותח עולם של אפשרויות ליצירת רכיבים שניתנים לשימוש חוזר ולתאימות באמת.
חשבו על רכיב כרטיס שעשוי להופיע בהקשרים שונים: סרגל צד צר, קטע גיבור רחב או רשת מרובת עמודות. עם שאילתות מדיה, הייתם צריכים לכתוב כללים ספציפיים לכל אחד מהתרחישים הללו בהתבסס על רוחב אזור התצוגה. עם שאילתות קונטיינר, הכרטיס יכול להתאים באופן חכם את הפריסה והעיצוב שלו בהתבסס על מימדי הקונטיינר ההורי שלו, ללא קשר לגודל המסך הכולל.
שאילתות קונטיינר מציעות מספר יתרונות מפתח על פני שאילתות מדיה מסורתיות:
בואו נצלול להיבטים המעשיים של שימוש בשאילתות קונטיינר. הצעד הראשון הוא להכריז על קונטיינר. ניתן לעשות זאת באמצעות המאפיין container-type על אלמנט ההורה:
המאפיין container-type מקבל מספר ערכים:
size: שאילתות הקונטיינר יגיבו הן למימדי ה-inline והן למימדי ה-block של הקונטיינר.inline-size: שאילתות הקונטיינר יגיבו רק למימד ה-inline (רוחב במצבי כתיבה אופקיים) של הקונטיינר. זוהי האפשרות הנפוצה ביותר ולעיתים קרובות גם השימושית ביותר.block-size: שאילתות הקונטיינר יגיבו רק למימד ה-block (גובה במצבי כתיבה אופקיים) של הקונטיינר.normal: האלמנט אינו קונטיינר שאילתה. זהו ערך ברירת המחדל.style: שאילתות הקונטיינר יגיבו לשאילתות סגנון (style queries) ושאילתות שם קונטיינר (container name queries) (יידונו בהמשך), מה שמאפשר לכם לשלוף מאפיינים מותאמים אישית שהוגדרו על הקונטיינר.הנה דוגמה להגדרת קונטיינר המגיב לגודל ה-inline שלו:
.card-container {
container-type: inline-size;
}
ניתן גם להשתמש במאפיין הקיצור container כדי לציין גם את ה-container-type וגם את ה-container-name (עליהם נדון בהמשך) בהצהרה אחת:
.card-container {
container: card / inline-size;
}
במקרה זה, 'card' הוא שם הקונטיינר.
לאחר שהגדרתם קונטיינר, תוכלו להשתמש בכלל ה-@container כדי לכתוב את השאילתות שלכם. התחביר דומה לשאילתות מדיה, אך במקום להתמקד במימדי אזור התצוגה, אתם מתמקדים במימדי הקונטיינר:
@container card (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
בדוגמה זו, אנו מכוונים לקונטיינר "card" ומחילים סגנונות על האלמנטים .card, .card__image ו-.card__content כאשר רוחב הקונטיינר הוא לפחות 400 פיקסלים. שימו לב ל-'card' לפני ה-(min-width: 400px). זה קריטי כשנתתם שם לקונטיינר שלכם באמצעות container-name או מאפיין הקיצור container.
אם לא נתתם שם לקונטיינר שלכם, תוכלו להשמיט את שם הקונטיינר:
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
תוכלו להשתמש באותו טווח של מאפייני מדיה הזמינים בשאילתות מדיה, כגון min-width, max-width, min-height, max-height, וכיוון (orientation).
מתן שמות לקונטיינרים יכול להיות מועיל, במיוחד כאשר מתמודדים עם קונטיינרים מקוננים או פריסות מורכבות. ניתן להקצות שם לקונטיינר באמצעות המאפיין container-name:
.card-container {
container-name: card;
container-type: inline-size;
}
לאחר מכן, בשאילתות הקונטיינר שלכם, תוכלו לכוון לקונטיינר לפי שמו:
@container card (min-width: 400px) {
/* סגנונות עבור קונטיינר ה-'card' */
}
שאילתות סגנון של קונטיינר (Container Style Queries) מאפשרות לכם להגיב לסגנון הקונטיינר שלכם במקום לגודלו. זה עוצמתי במיוחד בשילוב עם מאפיינים מותאמים אישית (custom properties). ראשית, עליכם להגדיר את הקונטיינר שלכם עם container-type: style:
.component-container {
container-type: style;
}
לאחר מכן תוכלו להשתמש ב-@container style(--theme: dark) כדי לשלוף את ערך המאפיין המותאם אישית --theme:
.component-container {
--theme: light;
}
@container style(--theme: dark) {
.component {
background-color: black;
color: white;
}
}
זה מאפשר לרכיבים שלכם להתאים את עצמם בהתבסס על תצורה המוגדרת באמצעות CSS ולא לפי גודל אזור התצוגה. זה פותח אפשרויות נהדרות עבור עיצוב (theming) וסגנון דינמי.
בואו נסתכל על כמה דוגמאות קונקרטיות לאופן שבו ניתן להשתמש בשאילתות קונטיינר בתרחישים אמיתיים:
תארו לעצמכם רכיב כרטיס המציג מידע על מוצר. בקונטיינר צר, אנו עשויים לרצות לערום את התמונה והתוכן אנכית. בקונטיינר רחב יותר, נוכל להציג אותם זה לצד זה.
HTML:
CSS:
.card-container {
container-type: inline-size;
}
.card {
display: flex;
flex-direction: column;
border: 1px solid #ccc;
padding: 16px;
}
.card__image {
width: 100%;
margin-bottom: 16px;
}
.card__content {
width: 100%;
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
margin-bottom: 0;
}
.card__content {
width: 50%;
}
}
בדוגמה זו, הכרטיס יציג בתחילה את התמונה והתוכן ערומים אנכית. כאשר רוחב הקונטיינר יגיע ל-400 פיקסלים, הכרטיס יעבור לפריסה אופקית.
שקלו תפריט ניווט שצריך להתאים את עצמו בהתבסס על השטח הפנוי. בקונטיינר צר (לדוגמה, סרגל צד לנייד), אנו עשויים לרצות להציג את פריטי התפריט ברשימה אנכית. בקונטיינר רחב יותר (לדוגמה, כותרת עליונה לשולחן עבודה), נוכל להציג אותם אופקית.
HTML:
CSS:
.nav-container {
container-type: inline-size;
}
.nav {
list-style: none;
padding: 0;
margin: 0;
}
.nav__item {
margin-bottom: 8px;
}
.nav__item a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: #333;
}
@container (min-width: 600px) {
.nav {
display: flex;
}
.nav__item {
margin-right: 16px;
margin-bottom: 0;
}
.nav__item a {
display: inline-block;
}
}
בדוגמה זו, תפריט הניווט יציג בתחילה את הפריטים ברשימה אנכית. כאשר רוחב הקונטיינר יגיע ל-600 פיקסלים, התפריט יעבור לפריסה אופקית.
תארו לעצמכם פריסת מאמר שצריך להתאים את עצמה בהתאם למקום שבו היא ממוקמת. אם בקטע תצוגה מקדימה קטן, התמונה צריכה להיות מעל הטקסט. אם זהו המאמר הראשי, התמונה יכולה להיות בצד.
HTML
כותרת מאמר
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
CSS
.article-container {
container-type: inline-size;
}
.article {
display: flex;
flex-direction: column;
}
.article-image {
width: 100%;
margin-bottom: 10px;
}
.article-content {
width: 100%;
}
@container (min-width: 768px) {
.article {
flex-direction: row;
}
.article-image {
width: 40%;
margin-right: 20px;
margin-bottom: 0;
}
.article-content {
width: 60%;
}
}
התמיכה בדפדפנים עבור שאילתות קונטיינר מצוינת כעת בכל הדפדפנים המודרניים, כולל Chrome, Firefox, Safari ו-Edge. חשוב לבדוק ב-Can I Use לקבלת המידע העדכני ביותר על תמיכה בדפדפנים, מכיוון שתכונות ופרטי יישום יכולים להתפתח.
בעוד ששאילתות קונטיינר מציעות חלופה עוצמתית לשאילתות מדיה, חשוב להבין מתי כל גישה מתאימה ביותר.
במקרים רבים, סביר להניח שתשתמשו בשילוב של שאילתות מדיה ושאילתות קונטיינר. השתמשו בשאילתות מדיה כדי לבסס את הפריסה הכוללת של האפליקציה שלכם, ולאחר מכן השתמשו בשאילתות קונטיינר כדי לכוונן את המראה וההתנהגות של רכיבים בודדים בתוך פריסה זו.
שאילתות קונטיינר ב-CSS מייצגות צעד משמעותי קדימה באבולוציה של העיצוב הרספונסיבי. על ידי הפעלת רספונסיביות מבוססת רכיבים, הן מעצימות מפתחים ליצור רכיבים גמישים יותר, ניתנים לשימוש חוזר וקלים לתחזוקה. ככל שהתמיכה בדפדפנים ממשיכה להשתפר, שאילתות קונטיינר עומדות להפוך לכלי חיוני בארסנל של כל מפתח ווב.
בעת יישום שאילתות קונטיינר עבור קהל גלובלי, שקלו את הדברים הבאים:
inline-start ו-inline-end במקום מאפיינים פיזיים כמו left ו-right.em, rem) כדי לוודא שהטקסט שלכם משתנה בקנה מידה מתאים.שאילתות קונטיינר ב-CSS הן כלי רב עוצמה לבניית יישומי ווב רספונסיביים וניתנים להתאמה באמת. על ידי אימוץ עיצוב רספונסיבי מבוסס רכיבים, תוכלו ליצור רכיבים שמתאימים בצורה חלקה להקשרים שונים, לפשט את הקוד שלכם ולשפר את חווית המשתמש הכוללת. ככל שהתמיכה בדפדפנים ממשיכה לגדול, שאילתות קונטיינר עומדות להפוך לחלק יסודי בפיתוח ווב מודרני. אמצו טכנולוגיה זו, התנסו ביכולותיה, ופתחו רמה חדשה של גמישות בעיצובים הרספונסיביים שלכם. גישה זו מאפשרת שימושיות חוזרת טובה יותר של רכיבים, תחזוקה טובה יותר ותהליך עיצוב אינטואיטיבי יותר, מה שהופך אותה לנכס רב ערך עבור מפתחי פרונט-אנד ברחבי העולם. המעבר לשאילתות קונטיינר מעודד גישה מוכוונת רכיבים יותר לעיצוב, וכתוצאה מכך חוויות ווב חזקות וניתנות להתאמה יותר עבור משתמשים בכל רחבי העולם.